package com.xpffly.design.builder.model;

import java.util.ArrayList;

/**
 * @Author: xpengfei
 * @Date: 2021/3/28 22:49
 * @Description：产品模型的抽象类
 */
public abstract class CarModel {

    /**
     * 各个方法的执行顺序
     */
    private ArrayList<String> sequence = new ArrayList<String>();

    /**
     * 启动
     */
    protected abstract void start();

    /**
     * 停止
     */
    protected abstract void stop();

    /**
     * 喇叭鸣笛
     */
    protected abstract void alarm();

    /**
     * 引擎响声
     */
    protected abstract void engineBoom();

    /**
     * 产品模型：车辆开始运行
     */
    public final void run() {
        // 遍历 sequence 中的方法，谁在前先执行谁
        for (int i = 0; i < this.sequence.size(); i++) {
            String actionName = this.sequence.get(i);
            // 启动汽车
            if (actionName.equalsIgnoreCase("start")) {
                this.start();
            }
            // 停止汽车
            if (actionName.equalsIgnoreCase("stop")) {
                this.stop();
            }
            // 汽车鸣笛
            if (actionName.equalsIgnoreCase("alarm")) {
                this.alarm();
            }
            // 汽车引擎发动
            if (actionName.equalsIgnoreCase("engine boom")) {
                this.engineBoom();
            }
        }
    }

    /**
     * 设定模型内方法的执行顺序
     *
     * @param sequence 顺序
     */
    public final void setSequence(ArrayList<String> sequence) {
        this.sequence = sequence;
    }
}
